home *** CD-ROM | disk | FTP | other *** search
/ Revolution - Das Atari CD Magazin 1997 / Revolution - Das Atari CD Magazin 1.iso / software / anwendng / qed_397 / sourcen / disk.c < prev    next >
C/C++ Source or Header  |  1997-01-04  |  11KB  |  505 lines

  1. #include "global.h"
  2. #include "clipbrd.h"
  3. #include "desktop.h"
  4. #include "edit.h"
  5. #include "event.h"
  6. #include "file.h"
  7. #include "find.h"
  8. #include "fsel.h"
  9. #include "icon.h"
  10. #include "mintlib.h"
  11. #include "projekt.h"
  12. #include "obj.h"
  13. #include "rsc.h"
  14. #include "scroll.h"
  15. #include "set.h"
  16. #include "text.h"
  17. #include "windows.h"
  18. #include "disk.h"
  19.  
  20. /* exportierte Variablen ***************************************************/
  21. WORD    idisk, disk_type;
  22.  
  23.  
  24. #define    TEMP_LINK    10001
  25.  
  26. /* lokale Variablen ********************************************************/
  27.  
  28. LOCAL RING        namen;        /* Wird vor init_disk benötigt */
  29. LOCAL BOOLEAN    namen_ok = FALSE;
  30. LOCAL WORD        di_nr;        /* LW-Nummer für Diskinfo */
  31. LOCAL FSEL         fsel;
  32.  
  33. /* lokale Prototypen *******************************************************/
  34.  
  35. LOCAL VOID         mdiskinfo    (VOID);
  36. LOCAL VOID        icon_exist    (WORD icon, SET actions);
  37. LOCAL BOOLEAN    icon_test    (WORD icon, WORD action);
  38. LOCAL WORD        icon_edit    (WORD icon, WORD action);
  39. LOCAL BOOLEAN    icon_drag    (WORD icon, WORD source);
  40.  
  41. /***************************************************************************/
  42.  
  43. LOCAL VOID icon_exist(WORD icon, SET actions)
  44. {
  45.     setclr(actions);
  46.     setincl(actions,DO_OPEN);
  47.     setincl(actions,DO_HELP);
  48.     setincl(actions,DO_FIND);
  49.     setincl(actions,DO_INFO);
  50.     setincl(actions,DO_INIT);
  51. }
  52.  
  53. LOCAL BOOLEAN    icon_test(WORD icon, WORD action)
  54. {
  55.     BOOLEAN erg;
  56.  
  57.     switch (action)
  58.     {
  59.         case DO_INIT :    erg = TRUE;    break;
  60.         case DO_INFO :    erg = TRUE;    break;
  61.         case DO_OPEN :    erg = TRUE;    break;
  62.         case DO_HELP :    erg = TRUE;    break;
  63.         case DO_FIND :    erg = TRUE; break;
  64.         default         :    erg = FALSE;
  65.     }
  66.     return erg;
  67. }
  68.  
  69. LOCAL WORD    icon_edit(WORD icon, WORD action)
  70. {
  71.     WORD        anz_files, i;
  72.     UBYTE        **files;
  73.     PATH        name, path;
  74.  
  75.     switch (action)
  76.     {
  77.         case DO_INIT:
  78.             show_icon(icon);
  79.             break;
  80.         case DO_INFO:
  81.             mdiskinfo();
  82.             break;
  83.         case DO_OPEN:
  84.             name[0] = EOS;
  85.             files = select_mfile(&fsel, name, STRING(LOADFILESTR), &anz_files);
  86.             if (anz_files > 0)
  87.             {
  88.                 if (files == NULL)
  89.                 {
  90.                     if (!global_shift && (filematch(name, "*.QPJ")))
  91.                         icon = load_projekt(name, TRUE, -1, -1, NULL);
  92.                     else
  93.                         icon = load_edit(name, TRUE, -1, -1, NULL);
  94.                 }
  95.                 else
  96.                 {
  97.                     file_splitt(name, path, NULL);
  98.                     for (i=0; i < anz_files; i++)
  99.                     {
  100.                         strcpy(name, path);
  101.                         strcat(name, files[i]);
  102.                         if (!global_shift && (filematch(name, "*.QPJ")))
  103.                             icon = load_projekt(name, TRUE, -1, -1, NULL);
  104.                         else
  105.                             icon = load_edit(name, TRUE, -1, -1, NULL);
  106.                     }
  107.                 }
  108.             }
  109.             break;
  110.         case DO_HELP:
  111.             note (1, HELPDISK);
  112.             break;
  113.         case DO_FIND:
  114.             icon = crt_new_prj("",-1,-1,NULL);
  115.             if (icon<0) break;
  116.                 if (do_icon(icon,DO_OPEN)<0)
  117.                 {
  118.                     note(1, NOWINDOW);
  119.                     if (no_desktop)
  120.                     {
  121.                         Icon_edit(icon, DO_DESTRUCT);
  122.                         break;
  123.                     }
  124.                 }
  125.             do_icon(icon,DO_ADD);
  126.             break;
  127.     }
  128.     return TRUE;
  129. }
  130.  
  131. /***************************************************************************/
  132. /* Reaktion des Verschiebens auf das DISK-Icon                                        */
  133. /***************************************************************************/
  134.  
  135. LOCAL BOOLEAN    icon_drag (WORD icon, WORD source)
  136. {
  137.     if (source==iclipbrd)
  138.         return (do_icon(source,DO_SAVENEW)>0);
  139.     return (do_icon(source,DO_SAVE)>0);
  140. }
  141.  
  142. LOCAL VOID get_info(WORD objc)
  143. {
  144.     ULONG        max_len, help, free, total;
  145.     UBYTE        str[20], name[15];
  146.  
  147.     Busy_mouse();
  148.     if (objc)
  149.         di_nr = objc-DIA;
  150.     else if (di_nr < 0)
  151.         di_nr = get_first_drive();
  152.     get_drive_space(di_nr + 1, &total, &free);
  153.     drive_name(di_nr + 1, name);
  154.     total = total >> 10;                                /* kByte */
  155.     free = free >> 10;                                /* kByte */
  156.     ltoa(free,str,10);
  157.     fill_ptext(diskinfo, DIFREE, str);
  158.     ltoa(total,str,10);
  159.     fill_ptext(diskinfo, DITOTAL, str);
  160.     fill_ptext(diskinfo, DINAME, name);
  161.     max_len = diskinfo[DIBOX1].ob_width;
  162.     if (total > free)
  163.         help = max_len * (total - free) / total;
  164.     else
  165.         help = 1;
  166.     help = min(max_len, help);
  167.     diskinfo[DIBOX2].ob_width = (short) help;
  168.     Last_mouse();
  169. }
  170.  
  171. LOCAL VOID mdiskinfo(VOID)
  172. {
  173.     ULONG        drv;
  174.     WORD        i, btn;
  175.     DIALINFO    dial;
  176.  
  177.     drv = Dsetdrv(Dgetdrv());
  178.     if (drv == 0)
  179.         return;
  180.     for (i = 0; drv, i <= DIZ-DIA; drv >>= 1, i++)
  181.         if (!(drv&1))
  182.             disable_objc(diskinfo, DIA + i, TRUE);
  183.     for (i = 0; i <= DIZ - DIA; i++)
  184.         select_objc(diskinfo, DIA + i, i == di_nr);
  185.     Arrow_mouse();
  186.     open_dial(diskinfo, FALSE, NULL, &dial);
  187.     get_info(0);
  188.     dial_draw(&dial);
  189.     do
  190.     {
  191.         btn = dial_do(&dial, NULL) & 0x7FFF;
  192.         if (btn >= DIA && btn <= DIZ)
  193.         {
  194.             get_info(btn);
  195.             draw_Objc(diskinfo, DIIBOX, MAX_DEPTH);
  196.         }
  197.     }
  198.     while (btn != DIOK);
  199.     select_objc(diskinfo, DIOK, FALSE);
  200.     dial_end(&dial);
  201.     Last_mouse();
  202. }
  203.  
  204. BOOLEAN get_qed(UBYTE *name)
  205. {
  206.     LINEP        lauf;
  207.     UBYTE        *str;
  208.     FILENAME    file;
  209.  
  210.     if (!namen_ok) return FALSE;
  211.     lauf = FIRST(&namen);
  212.     if (IS_LAST(lauf)) return FALSE;
  213.     str = TEXT(lauf);
  214.     while (TRUE)                                    /* letzte ist leer */
  215.     {
  216.         while (*str=='-' || *str=='"' || (*str>='0' && *str<='9'))
  217.         {
  218.             NEXT(lauf);
  219.             if (IS_LAST(lauf)) return FALSE;
  220.             str = TEXT(lauf);
  221.         }
  222.         file_name((UBYTE *)str, file, FALSE);
  223.         if (filematch(file,"*.QED") && file_exist((UBYTE *)str))
  224.         {
  225.             strcpy(name, (UBYTE *)str);
  226.             col_delete(lauf);
  227.             namen.lines--;
  228.             if (namen.lines==1)
  229.             {
  230.                 kill_textring(&namen);
  231.                 namen_ok = FALSE;
  232.             }
  233.             return TRUE;
  234.         }
  235.         NEXT(lauf);
  236.         if (IS_LAST(lauf)) break;
  237.         str = TEXT(lauf);
  238.     }
  239.     return FALSE;
  240. }
  241.  
  242. BOOLEAN next_cmd(UBYTE *token, BOOLEAN destruct)
  243. {
  244.     LINEP lauf;
  245.  
  246.     if (!namen_ok) return FALSE;
  247.     lauf = FIRST(&namen);
  248.     while (lauf->info&MARKED)
  249.     {
  250.         NEXT(lauf);
  251.         if (IS_LAST(lauf))                    /* letzte ist leer */
  252.         {
  253.             if (destruct)
  254.             {
  255.                 kill_textring(&namen);
  256.                 namen_ok = FALSE;
  257.             }
  258.             else
  259.             {
  260.                 lauf = FIRST(&namen);
  261.                 while (!IS_LAST(lauf))
  262.                 {
  263.                     lauf->info &= (~MARKED);
  264.                     NEXT(lauf);
  265.                 }
  266.             }
  267.             return FALSE;
  268.         }
  269.     }
  270.     lauf->info |= MARKED;
  271.     strcpy(token, (UBYTE *)TEXT(lauf));
  272.     return TRUE;
  273. }
  274.  
  275. /* init = TRUE: immer ganz vorne einfuegen (=> andre Reihenfolge und */
  276. /*              vor Kommandozeile                                    */
  277.  
  278. #if 0
  279. LOCAL VOID dump_namen(VOID)
  280. {
  281.     LINEP lauf;
  282.  
  283.     Debug("namen: \n");
  284.     lauf = FIRST(&namen);
  285.     if (lauf == NULL)
  286.         Debug("  ist leer\n");
  287.  
  288.     while (!IS_LAST(lauf))
  289.     {
  290.         Debug("  %s\n", TEXT(lauf));
  291.         NEXT(lauf);
  292.     }
  293. }
  294. #endif
  295.  
  296. VOID add_diskinfo(UBYTE *str, BOOLEAN init)
  297. {
  298.     BOOLEAN    in_quote = FALSE;
  299.     WORD        i, j, len;
  300.     UBYTE        zeile[256];
  301.     LINEP        lauf, new,
  302.                 init_namen;
  303.  
  304.     if (str[0] == EOS)
  305.         return;
  306.  
  307. #if 0
  308. Debug("add   : %s\n", str);
  309. #endif
  310.  
  311.     if (!namen_ok)
  312.     {
  313.         init_textring(&namen);
  314.         namen_ok = TRUE;
  315.     }
  316.     init_namen = &namen.head;
  317.     lauf = LAST(&namen);                    /* letzte (leere) Zeile */
  318.  
  319.     len = (short)strlen(str);
  320.     i = 0;
  321.     j = 0;
  322.     while (i <= len)
  323.     {
  324.         if (str[i] == '\'')
  325.         {
  326.  
  327.             if (!in_quote || (in_quote && str[i+1] == '\''))
  328.                 in_quote = TRUE;
  329.             else
  330.                 in_quote = FALSE;
  331.             i++;                                                /* ' oder " überspringen */
  332.         }
  333.         if (((str[i] == ' ') && (!in_quote))||        /* Blank als Trenner */
  334.              (i == len))                                    /* letztes Zeichen */
  335.         {
  336.             zeile[j] = EOS;
  337.             j = 0;
  338.  
  339.             if (zeile[0] != '-' && (zeile[0] < '0' || zeile[0] > '9'))
  340.                 make_normalpath(zeile, FALSE);
  341. #if 0
  342. Debug(" zeile: %s\n", zeile);
  343. #endif
  344.             new = new_col_b((UBYTE *) zeile, (short) strlen(zeile));
  345.             if (init)
  346.             {
  347.                 col_insert(init_namen, new);
  348.                 NEXT(init_namen);
  349.             }
  350.             else
  351.                 col_insert(lauf->vorg, new);
  352.             namen.lines++;
  353.         }
  354.         else
  355.         {
  356.             zeile[j] = str[i];
  357.             j++;
  358.         }
  359.         i++;
  360.     }
  361. }
  362.  
  363.  
  364. VOID open_multidisk(VOID)
  365. {
  366.     UBYTE        s[256];
  367.     UBYTE        m2_error_str[80];
  368.     PATH        name;
  369.     WORD        icon, icon_x, icon_y, i;
  370.     LONG        y;
  371.     RECT        win;
  372.     BOOLEAN    no_text, no_prj, weiter, do_goto;
  373.     BOOLEAN    text, open;
  374.     BOOLEAN    is_projekt;
  375.  
  376. /*    dump_namen();*/
  377.     no_prj = no_text = FALSE;
  378.     weiter = next_cmd(s,TRUE);
  379.     while (weiter && (!abbruch() || note(2,BREAK)==2))
  380.     {
  381.         text = TRUE;
  382.         open = TRUE;
  383.         m2_error_str[0] = EOS;
  384.         desire_x = 0;
  385.         desire_y = 0;
  386.         do_goto = FALSE;
  387.         icon_x = icon_y = win.x = win.y = win.w = win.h = -1;
  388.  
  389.         strcpy(name ,s);
  390.         is_projekt = filematch(name, "*.QPJ");
  391.         if (is_projekt)
  392.             text = FALSE;
  393.  
  394.         weiter = next_cmd(s,TRUE);                    /* nächstes Token */
  395.         if (weiter && *s >= '0' && *s <= '9')    /* Zeilennummer übergeben */
  396.         {
  397.             do_goto = TRUE;
  398.             y = atol(s) - 1;
  399.             if (y > 0)
  400.                 desire_y = y;
  401.             weiter = next_cmd(s,TRUE);                    /* nächstes Token */
  402.             if (weiter && *s >='0' && *s <= '9')    /* auch Zahl => x-Position */
  403.             {
  404.                 i = atoi(s) - 1;
  405.                 if (i > 0)
  406.                     desire_x = i;
  407.                 weiter = next_cmd(s,TRUE);            /* nächstes Token */
  408.             }
  409.         }
  410.         while (weiter && *s=='-')
  411.         {
  412.             switch(s[1])
  413.             {
  414.                 case 'o':
  415.                     open = FALSE;                            /* -o : nicht öffnen */
  416.                     break;
  417.                 case 't':
  418.                     if (is_projekt)
  419.                         text = TRUE;                        /* -t : Projekt als Text laden */
  420.                     break;
  421.                 case 'i':
  422.                     if (!next_cmd(s,TRUE))
  423.                         return;    /* -i Icon-Position */
  424.                     icon_x = atoi(s);
  425.                     if (!next_cmd(s,TRUE))
  426.                         return;
  427.                     icon_y = atoi(s);
  428.                     break;
  429.                 case 'w':
  430.                     if (!next_cmd(s,TRUE))
  431.                         return;    /* -w Fensterkoordinaten */
  432.                     win.x = atoi(s);
  433.                     if (!next_cmd(s,TRUE))
  434.                         return;
  435.                     win.y = atoi(s);
  436.                     if (!next_cmd(s,TRUE))
  437.                         return;
  438.                     win.w = atoi(s);
  439.                     if (!next_cmd(s,TRUE))
  440.                         return;
  441.                     win.h = atoi(s);
  442.                     break;
  443.             }
  444.             weiter = next_cmd(s,TRUE);                /* nächstes Token */
  445.         }
  446.         if (weiter && s[0]=='"' && s[strlen(s)-1]=='"')    /* Fehlertext des M2-Compilers */
  447.         {
  448.             *(UBYTE*)COPYB(m2_error_str,s,78) = EOS;
  449.             weiter = next_cmd(s,TRUE);                /* nächstes Token */
  450.         }
  451.         icon = -1;
  452.         if (name[strlen(name)-1]=='\\')            /* Es wurde Pfad übergeben */
  453.         {
  454.             set_fsel_path(name);
  455.             do_icon(idisk, DO_OPEN);
  456.             continue;    /* nicht weiter */
  457.         }
  458.         if (text && !no_text && (name[0] != EOS))
  459.         {
  460.             if (!caseSens(name, NULL))
  461.                 str_upper(name);
  462.             if ((icon=still_loaded(name))<0)
  463.             {
  464.                 icon = load_edit (name, FALSE, icon_x, icon_y, &win);
  465.                 if (icon < -1)
  466.                     no_text = TRUE;        /* Keine Texte mehr laden */
  467.             }
  468.         }
  469.         else if (!text && !no_prj && (name[0] != EOS))
  470.         {
  471.             if (!caseSens(name, NULL))
  472.                 str_upper(name);
  473.             if ((icon=prj_still_loaded(name))<0)
  474.             {
  475.                 icon = load_projekt (name, FALSE, icon_x, icon_y, &win);
  476.                 if (icon < -1)
  477.                     no_prj = TRUE;        /* Kein Projekt mehr laden */
  478.             }
  479.         }
  480.         if (icon >= 0)
  481.         {
  482.             if (m2_error_str[0] != EOS)
  483.             {
  484.                 strcpy(s, STRING(ERRORSTR));
  485.                 strcat(s, m2_error_str);
  486.                 set_info(get_text(icon), s);
  487.             }
  488.             if (open && !(nkc_kstate() & 3L))
  489.                 do_icon(icon, DO_OPEN);
  490.         }
  491.         if (do_goto)                                /* Zeilennummer übergeben */
  492.             Icon_edit(icon, DO_GOTO);
  493.     }
  494. }
  495.  
  496. /*****************************************************************************/
  497.  
  498. VOID init_disk (VOID)
  499. {
  500.     strcpy(fsel.suffix,"*.*");
  501.     fsel.name[0] = EOS;
  502.     di_nr = get_first_drive();
  503.     disk_type = decl_icon_type(icon_test,icon_edit,icon_exist,icon_drag);
  504. }
  505.